<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<base href="http://localhost/notebook/"/>
	<title>《Android 2高级编程（第2版）》英·Reto Meier 著 王超 译</title>
	<link rel="stylesheet" type="text/css" href="./css/default.css"/>
</head>
<body>
<article>
	<header>
		<h1>前言</h1>
	</header>
	<section>
		<p>本书使用的所有源代码都可以从http://www.wrox.com或http://www.tupwk.com.cn/downpage上下载。本书英文版的ISBN号是978-0-470-56552-0。</p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第1章 Android简介</h1>
		<section class="tips">
			<ul>
				<li>移动应用程序开发简介</li>
				<li>Android简介</li>
				<li>Android SDK特征简介</li>
				<li>适用Android的设备</li>
				<li>从事移动开发和Android开发的原因</li>
				<li>Android SDK和开发架构简介</li>
			</ul>
		</section>
	</header>
	<section>
		<p>
			Android的本地应用程序和第三方应用程序使用相同的API编写并在相同的运行时上执行。Android通过提供一个以开源的Linux内核为基础而构建的开放的开发环境，为移动应用程序的开发提供了新机遇。通过一系列API库，所有应用程序都可以访问硬件，并在严格受控的条件下完全支持应用程序之间的交互。</p>

		<p>通过GPS和Google的GSM基于蜂窝（cell-based）的定位技术可以确定设备的位置。为了把地图和位置联系起来，Android包含了一个用于地理编码（geocoding）和逆地理编码（revers
			geocoding）的API，从而可以使你找到一个地址所对应的地图坐标和一个地图位置所对应的地置。</p>

		<p>如果需要利用C/C++程序，可使用Android提供的Native Development
			Kit（NDK），设计NDK的目的是允许使用libc和libm库以及对OpenGL的本地访问创建C++库。要查看Android底层的东西可以去http://groups.google.com/group/android-internals。</p>
	</section>
	<footer>
		<p>
			所有的Android应用程序具有相同的优先级，允许用户用一个应用程序完全取代另一个应用程序。这一章介绍了Android的基本功能和特点，是个很不错的系统。Android的开发社区：http://code.google.com/android/groups。</p>
	</footer>
</article>
<article>
	<header>
		<h1>第2章 开始入手</h1>
		<section class="tips">
			<ul>
				<li>如何安装Android SDK、创建开发环境和调试项目</li>
				<li>理解移动设计中的一些注意事项，以及针对速度和效率进行优化和为小屏幕设备及移动数据连接进行设计的重要性</li>
				<li>使用Android虚拟设备、模拟器和开发人员工具</li>
			</ul>
		</section>
	</header>
	<section>
		<p>这一章介绍了Eclipse下的Android环境搭建和开发，现在Google推出了Android Studio
			1.0。如需用Eclipse的ADT插件作为开发环境，只需在Eclipse的软件源中添加http://dl-ssl.google.com/android/eclipse/即可，注意，要使用http而不是https，安装ADT插件，重启后定义SDK目录即可。Android
			Studio的SDK已经独立出来，因此，可以和Eclipse共用一套SDK。</p>

		<p>提到的移动终端应当注意的那些问题，已经不成为问题了，除了屏幕小点要考虑，其它的已经不成问题，其实更应当说是优势。</p>

		<p>设计手机应用程序时应注意以下几个问题：</p>
		<ul>
			<li>行为得当：保证不在前台运行的时候应当被挂起。如果在后台时仍需继续运行，则需要使用Service类。</li>
			<li>流畅地从后台切换到前台：由于移动设备的多任务性，应用程序可能会频繁地进行前后台切换。</li>
			<li>合理：应用程序绝地不抢占注意力或打断用户当前的Activity。</li>
			<li>呈现一致的用户界面：它应该易于使用，符合用户习惯。</li>
			<li>快速响应</li>
		</ul>
		<p>DDMS是Android的调试工具，可以在运行时设备底层发生的响应。</p>
	</section>
	<footer>
		<p>这一节写了一个TodoList的小应用。讲了Anrdroid的调试工具以及对应用开发的基本要求。</p>
	</footer>
</article>
<article>
	<header>
		<h1>第3章 创建应用程序和Activity</h1>
		<section class="tips">
			<ul>
				<li>介绍Android应用程序组件，以及用这些组件构建的各种应用程序</li>
				<li>Android应用程序的生命周期</li>
				<li>如何创建和注释应用程序</li>
				<li>如何命名用外部资源提供对位置、语言和硬件配置的动态支持</li>
				<li>如何实现和使用自己的Application类</li>
				<li>如何创建新Activity</li>
				<li>理解Activity的状态转换和生命周期</li>
			</ul>
		</section>
	</header>
	<section>
		<p>
			Activity类是最重要的Android构建模块，它是所有用户界面的基础。Android应用程序由松散耦合的组件组成，并使用清单文件定义其关系，将它们绑定在一起。应用程序清单文件描述了每一个组件、它们之间的交互方式，以及应用程序元数据（包括硬件和平台要求）。以下7个组件提供了应用程序的基本结构模块：</p>
		<ul>
			<li>Activity:这是应用程序的表示层，类似于桌面应用程序的窗口界面。</li>
			<li>Service:在后台运行，可以更新数据源和可见的活动并触发通知。</li>
			<li>Content Provider:它是在应用程序间共享数据的首选方法，用于管理和共享应用程序数据库。可通过配置自己的Content
				Provider允许其他应用程序访问存储的数据，也可以使用其它应用程序的Content Provider来访问它们存储的数据。比如媒体库和联系人信息等。
			</li>
			<li>Intent:应用程序之间的消息传递框架。</li>
			<li>Broadcast Receiver:Intent的使用者，通过创建和注册Broadcast Receiver应用程序可以监听那些匹配的特定的过滤标准和Intent广播。</li>
			<li>Widget:可添加到主屏幕的可视化组件。它是Broadcast Receiver的变体，可用于创建动态的交互式应用程序组件。</li>
			<li>Notification:一种用户通知框架。允许向用户发送信号，但不会过度吸引他们的注意力或打断当前的活动。是Service或Braodcast Receiver引起用户注意的首选方法。</li>
		</ul>
		<p>清单文件AndroidManifest.xml，根元素是manifest，可在其中定义xmlns、package、versionCode和versionName等属性。主要的子节点如下：</p>
		<ul>
			<li>
				uses-sdk:用于定义运行程序所需的最低和最高SDK版本，如果没有定义最低SDK版本，那么系统会自动假定一个，这样如果app试图调用设备上不存在的API就会失败。最好不要设置最高SDK。而这两个属性在Android
				Studio1.0中都被取消了。
			</li>
			<li>uses-configuration:用于定义应用程序所需的输入机制组合配置，如果不满足要求，则应用不会被安装在设备上。理想情况下，app应该可用于任何设备，因此这个节点也很少用。</li>
			<li>uses-feature:用于定义app所需的硬件，比如摄像头-android.hardware.camera。</li>
			<li>support-screens:指定应用程序可以支持 以及不能支持的屏幕尺寸。只要有可能就应当让应用适应尽可能多的屏幕。</li>
			<li>
				application:每个清单只能包含一个application，用来定义app的各种元数据（包括图标、标题、主题等）。在开发时，应该包含一个设置为true的debuggable属性以启用调试，但是发布时应当禁用此属性。application有以下子节点：
				<ul>
					<li>
						activity:app显示的每个activity都要有一个activity标签，并使用android:name属性来指定Activity类的名称。启动任何一个没有在清单中定义的activity都会抛出一个运行时异常。每个activity节点都可能使用intent-filter子标签来定指定它自己的启动方式。
					</li>
					<li>service:需要为app中使用的每个Service类创建此标签，它也支持intent-filter子标签来允许运行时绑定</li>
					<li>provider:用来指定app中的每一个content provider。</li>
					<li>receiver:用来注册broadcast receiver，这类app可以不用事先启动。一旦注册之后，无论何时，只要与它相匹配的Intent被系统和app广播出来，它就会立即执行。
					</li>
				</ul>
			</li>
			<li>uses-permission:定义app正常运行所需要的系统权限，在安装时会由用户来确定是否开放这些权限。</li>
			<li>permission:用来定义该问权限的级别，定义之后其它app就可以通过uses-permission来使用你共享的资源。</li>
			<li>instrumentation:这是一个测试框架，用来在app运行时测试组件。</li>
		</ul>
		<p>Android应用程序不能控制自己的生命周期，而且随时会被终止。Android主动管理着它的资源，必要的时候，进程可能会在没有警告的情况下被终止。Android按照优先级分类来处理进程。具体如下：</p>
		<ol>
			<li>活动进程-关键优先级：位于前台并对用户事件做出响应</li>
			<li>可见进程-高优先级：被遮挡的Activity</li>
			<li>启动服务进程-高优先级：在后台运行的服务，因为没有直接和用户交互，所以优先级要比可见进程低</li>
			<li>后台进程-低优先级：不可见，没有任何下在运行的服务的Activity</li>
			<li>空进程-低优先级：为了提高系统的整体性能，Android经常在应用程序的生存期结束之后仍把它们保存在内存中。</li>
		</ol>
		<p>不管使用什么环境，把非代码资源（图片、动画、主题、字符串常量等）和代码分离开都是一种很好的做法。Android的资源树包含对应于各种可选硬件、语言和位置的值，可以为不同语言、国家和屏幕
			创建不同的资源值。9种资源分别有各自的文件夹来保存：简单值、Drawable、布局、动画、样式、菜单、searchable、XML和原始资源。在编译时会创建一个R文件，它包含了对所有资源的引用。</p>

		<p>用于保存资源的xml文件的根节点是resources，可以把所有资源值放在一个xml文件中，但习惯上是按资源类别分开存放，比如res/values/strings.xml只保存字符串资源。</p>
		<ul>
			<li>简单值：位于res/values目录下，保存包括字符串(strings.xml)、颜色(colors.xml)、尺寸（dimens.xml)和字符串数组或整型数组。</li>
			<li>
				样式和主题：样式资源可以指定视图所使用的属性值，使app保存一个一致的用户界面体验。要创建式样，使用在资源文件中使用style标签，style标签的parent属性定义样式继承的父样式，在原有样式的基础上进行扩展。
			</li>
			<li>drawable:包括位图和NinePatch(可拉伸的PNG图像）。</li>
			<li>布局：每个布书定义都在res/layout目录下，文件名就是它的资源标识符。</li>
			<li>
				动画：Android支持补间动画(旋转、移动、变形的动画）和逐帧动画两种类型。每个补间动画都保存在res/anim目录下的一个单独的xml文件中，动画的文件名就是它的资源标识符。逐帧动画是一系列的drawable对象，因此它存储在res/drawable目录下。
			</li>
			<li>菜单：在XML中设计菜单布局而不是代码中构建可以进一步分离表示层。</li>
		</ul>
		<p>
			在代码中使用资源是通过R类来访问，R中的每个子类都把它的相关资源表示为变量的形式，比如：R.string.app_name，这些变量的值是对资源表中对应的资源位置的引用，而不是资源本身的一个实例。因此，只能借用它来访问资源，而不是用它直接使用资源。当需要一个资源本身的实例时，可用Resources类（资源表就是Resources类的一个实例）来获得。</p>

		<p>在资源中引用其它资源，使用@符号,格式如下：attribute = "@[package:]resourceType/resourceIdentifier"</p>

		<p>使用系统资源：在代码中访问本地系统资源和使用自己的资源的方法类似，只是要使用的是android.R类即可。在资源文件中访问只需指定android作为包名即可，比如：android:text =
			"@android:string/httpErrorBadUrl"</p>

		<p>在当前的主题中引用样式：需要使用?android:作为前缀，而不是@，以引用当前主题的资源。比如：android:textColor = ?android:textColor</p>

		<p>指定可选的资源值是通过在res文件夹下使用并行的目录结构来实现的，并使用连字符-来分隔限定符。比如：values-zh。可用的限定符如下：</p>
		<ol>
			<li>Mobile Country Code（MCC）和Mobile Network
				Code（MNC）与设备中当前使用的SIM关联的国家和（可选的）网络。MCC是通过mcc+3个数字的国家代码指定的，也可以选择使用mnc+两个数字或三个数字的网络代码添加MNC，比如mcc234-mnc20或mcc310。可以从Wikipedia上找到MCC/MNC的代码列表：http://en.wikipedia.org/wiki/Mobile_Network_Code。
			</li>
			<li>语言和地区：使用小写的两字母组成ISO 639-1语言编码，比如alues-fr，后面可选择附加地区，方式为-r+大写两字母的ISO 3166-1-alhpa语言编码，比如：values-fr-rCA。
			</li>
			<li>屏幕大小： smaill（小于HVGA）、medium（至少为HVGA，小于VGA）或large（VGA或更大）</li>
			<li>屏幕宽度/长度：为专为宽屏幕设计的资源指定long或者notlong（比如WVGA为long，QVGA为notlong）</li>
			<li>屏幕方向：port（portrait，纵向）、land（landscape，横向）或者square（正方形）。</li>
			<li>
				屏幕像素密度：像素密度以点每英寸（dpi）来表示。分别使用ldpi、mdpi和hdpi来指定低（120dpi）、中（160dpi）或高（240dpi）像素密度是最好的做法。可以为不想缩放的位图资源指定nodpi，以便支持精确的屏幕密度。Android在选择资源时不要求精确匹配，当选择合适的文件夹时，它会选择与设备的像素密度最接近的匹配，并相应地缩放产生的Drawable。
			</li>
			<li>触摸屏类型：notouch/stylus/finger</li>
			<li>可用键盘：keysexposed/keyshidden或keyssoft</li>
			<li>链盘输入类型：nokeys/qwerty/12key</li>
			<li>UI导航类型：notouch/dpad/trackball/wheel</li>
		</ol>
		<p>
			对于任何资源类型都可以指定多个限定符，只需用连字符隔开即可，任何类型组合都是允许的，但必须按上面的顺序排列，而且每个类型不得超过一个值。比如：drawable-en-rUS-keyshidden-dpad。如果在给定设备上没有找到资源匹配，app将会在尝试访问该资源时抛出一个异常，要避免这种情况，应该总是在包含限定符的文件夹中为每个资源类型包含一个默认值。</p>

		<p>
			Andriod支持在运行时更改语言、位置和硬件，它是通过终止和重启每一个app并重新加载资源实现的。Activity可以监听运行时配置的更改（比如屏幕方向变了），要实现这个功能只需在它的清单节点中添另一个android:configChanges属性，来说明希望对哪些配置进行更改。下面是可以指定的运行时更改列表：</p>
		<ul>
			<li>orientation:屏幕在横向和纵向之间进行切换</li>
			<li>keyboardHidden:进行了键盘显示或隐藏操作</li>
			<li>fontScale:修改了首选字体大小</li>
			<li>locale:选择了不同的语言区域</li>
			<li>keyboard:对键盘类型进行了更改</li>
			<li>touchscreen或navigation:键盘类型或导航方式发生了改变。这两种事件通常不会发生。</li>
		</ul>
		<p>
			在特定的情况下，多个事件可能会同时触发例如：当用户滑动键盘时，会触发keyboardHidden和orientation事件。要同时监控这两个事件只需用在定义中用管道符|将事件分隔开即可，比如：android:configChanges="orientation
			| keyboardHidden"。</p>

		<p>
			添加android:configChanges属性可以阴止由于特定配置改变而造成的重启，相应的，它会触发activity的onConfigurationChanged方法。可以通过重写这个方示来处理配置的改变，并使用传入的Configuration对象来确定新的配置值。当onConfigurationChanged被调用的时候，activity的资源变量的值就已经被更新了，所以使用它们是很安全的。在没有调用onConfigurationChanged方法的情况下，那些没有显示标记为被应用程序处理了的任何配置更改都会导致应用程序重启。</p>

		<p>Application类可以完成三项工作：</p>
		<ul>
			<li>维护应用程序的状态</li>
			<li>在应用程序组件之间传递对象</li>
			<li>管理和维护多个应用程序组件使用的资源</li>
		</ul>
		<p>
			在清单中注册了Application后，它会在创建应用程序的时候实例化。因此，它的实现本质上是单态的，并且应该作为单态进行实现，以便提供对其方法和成员变量的访问。Application类为应用程序的创建和终止、低可用内存和配置改变提供了事件处理程序，通过重写以下方法，可以为上述几种情况实现自己的应用程序行为：</p>
		<ul>
			<li>onCreate:在创建应用程序时调用。重写这个方法以创建和实例化任何应用程序状态变量或共享资源</li>
			<li>onTerminate:当终止应用时调用，但不保证一定会被执行</li>
			<li>onLowMemory:当系统资源匮乏时调用。一般只会在后台进程已终止但前台应用程序仍缺少内存时调用，可用这个方法来清空缓存或释放不必要的资源</li>
			<li>onConfigurationChanged:与Activity不同，这个方法在配置改变时可以不用终止和重启应用程序。</li>
		</ul>
		<p>
			要为App创建用户界面，通过扩展Activity类来实现，并使用视图来提供UI和用户交互。每个Activity都是一个屏幕，应用程序越复杂需要的屏幕就越多。要在屏幕间切换就必须要启动一个新的Activity或从一个Activity返回。</p>

		<p>
			Android的用户界面定义和执行代码是分离的，即表现与样式分离的MVC架构，要为Activity指定外观需要使用它的onCreate()方法中的setContentView()方法。要在应程序中使用Activity，需要要清单文件的Application节点下注册它，否则它是不能被在应用程序中被访问。</p>

		<p>要想让一个Activity可以被主程序启动器使用，它必须包含一个监听MAIN动作和LAUNCHER分类的意图过滤器，如下：</p>
        <pre>
        &lt;intent-filter&gt;
            &lt;action android:name="android.intent.action.MAIN" /&gt;

            &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
        &lt;/intent-filter&gt;
        </pre>
		<p>Android以栈的形式来管理Activity，当一个新的Activity启动时，当前的前台屏幕即会移动到栈顶，如果使用Back键返回或前台被关闭，那么栈中的下一个Activity就会移到栈顶变为活动状态。</p>

		<p>Activity状态:</p>
		<ul>
			<li>
				活动状态：当一个Activity位于栈顶时，它是可见的具有焦点的前台Activity，它可以接收用户输入，Activity将不惜一切代价保持它的状态，并根据需要销毁下面部分的Activity，以保证这个Activity拥有它所需的资源。
			</li>
			<li>暂停状态：在某些情况下，Activity是可见的，但是没有获得焦点，此时它就处理暂停状态。当一个透明或非全屏的Activity位于一个Activity之前时，那么后者即处于暂停状态。</li>
			<li>
				停止状态：当一个Activity不可见的时候，它就处于停止状态。此时Activity仍停留在内存中，保存所有的状态和成员信息，然而当系统的其他地方要求使用内存的时候，它们就会成为被终止的首要侯选对象。因此，在一个Activity被停止的时候，保存数据和当前的UI状态是很重要的。
			</li>
			<li>非活动状态：当一个Activity被终止后，在启动前它就处于非活动状态。</li>
		</ul>
		<p>状态转化是非确定性的，完全由Android内存管理器处理。它首先会关闭含
			有非活动状态Activity的App，接着会关闭那些停止响应的App，只有在极端的情况下它才会移除那些被暂停的App。完整的Activity生命周期代码示例如下：</p>
		<pre>
		/**
		* 第一次创建Activity时被调用
		* @param savedInstanceState
		*/
		@Override
		protected void onCreate(Bundle savedInstanceState)
		{
			//在完整的生存周期开始时被调用
			super.onCreate(savedInstanceState);
			setContentView(R.layout.activity_main); //指定布局外观
		}

		//在onCreate方法完成后调用，用于恢复UI状态
		@Override
		public void onRestoreInstanceState(Bundle savedInstanceState)
		{
			//从svaedInstanceState恢复UI状态
			//这个Bundel也被传递 给了onCreate
			super.onRestoreInstanceState(savedInstanceState);
		}

		//在随后的Activity进程可见生存期之前调用
		@Override
		public void onRestart()
		{
			super.onRestart();

			//加载改栾，知道Activity在此进程中已经是可见的了
		}

		//在Activity可见生存期的开始时调用
		@Override
		public void onStart()
		{
			super.onStart();
		}

		//在Activity状态生存期开始时调用
		@Override
		public void onResume()
		{
			super.onResume();

			//恢复Activity需要
		}

		//在Activity生命周期结束时调用，用来保存UI状态
		@Override
		public void onSaveInstanceState(Bundle savedInstanceState)
		{
			//把UI状态保存在saveInstanceState中
			//如果进程被终于并被重启，那么这个Bundle将被传递给onCreate
			super.onSaveInstanceState(savedInstanceState);
		}

		//在Activity生存周期结束时调用
		@Override
		public void onPause()
		{
			//当Activity不在前台时
			//挂起不需要更新的UI更新、线程或CPU密集的进程
			super.onPause();
		}

		//在生存周期结束时调用
		@Override
		public void onStop()
		{
			//当Activity不可见时，挂起不需要的UI更新、线程或处理
			//保存所有的编辑或者状态改变，因为在调用这个方法后，进程可能会被终止
			super.onStop();
		}

		//在完整的生存周期结束时调用
		@Override
		public void onDestroy()
		{
			//清理所有的资源、包括结束线程、关闭数据库连接等
			super.onDestroy();
		}
		</pre>
		<p>应尽量避免创建短期的对象，因为它的快速创建和销毁会导致额外的垃圾收集过程。如果Activity是有規律創建的對象集，可以考虛在onCreate方法中創建它們，因爲它只在Activity的生存期中被調用一次。</p>
		<p>onStop方法應當用來暫停或者停止動畫、線程、傳感器監聽器、GPS查找、定時器、服務或者其他專門和於更新用戶界面的進程，當UI不可見時更新它是沒意義的，在UI重新可見的時候，可以使用onStart（或者onRestart）方法來恢復或者重啓這些進程。</p>
		<p>Android SDK選擇了一些活動子類來封裝對常用的用戶界面小組件的使用：MapActivity（這當然是地圖的小組件了）、ListActivity（將ListView綁定到數據源，從而作爲主UI元素，並提供事件處理程序）、ExpandableListActivity（與ListActivity類似，但它支持ExpandableListView）、ActivityGroup（實現在一個屏幕上嵌入多個Activity或視圖，並使用選項卡小組件在它們之間切換）。</p>
	</section>
	<footer>
		<p>這一章講了Android App的生命周期和小組件以及鬆耦合的MVC設計模式。</p>
	</footer>
</article>
<article>
	<header>
		<h1>第4章 创建用户界面</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第5章 意图、广播和接收器</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第6章 文件、保存状态和首选项</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第7章 数据库和内容提供器</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第8章 地图、地理编码和基于位置的服务</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第9章 后台工作</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第10章 个性化手机屏幕</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第11章 音频、视频以及摄像头的使用</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第12章 电话服务和SMS</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第13章 蓝牙、网络和Wi-fi</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第14章 传感器</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
<article>
	<header>
		<h1>第15章 Android高级开发</h1>
		<section class="tips">
			<ul>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
		</section>
	</header>
	<section>
		<p></p>
	</section>
	<footer>
		<p></p>
	</footer>
</article>
</body>
</html>